package com.thinking.in.spring.bean.definition;

import com.think.in.spring.ioc.overview.domain.User;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionReaderUtils;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Import;
import org.springframework.stereotype.Component;


/**
 *
 * 注解的方式，配置 bean源信息 ：
 *      方式一：@Bean
 *      方式二：@Component
 *      方式三：@Import
 *
 * @author : zjj
 * @date : 2021/12/28 15:55
 */
@Import(AnnotationBeanDefinitionDemo.Config.class)
public class AnnotationBeanDefinitionDemo {

    public static void main(String[] args) {

        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();


        //  通过 API 的方式，注册Bean 定义信息
        registerUserBeanDefinition(applicationContext,"mercyblitz");

        registerUserBeanDefinition(applicationContext);


        /**
         * 注册 Configuration Class - 配置类
         */
        applicationContext.register(AnnotationBeanDefinitionDemo.class);

        // 启动容器
        applicationContext.refresh();

        // 依赖查询的方式找 Bean
        System.out.println("config 类型的 所有 Bean " +  applicationContext.getBeansOfType(Config.class));

        System.out.println("user类型的所有bean " + applicationContext.getBeansOfType(User.class));

        // 关闭容器
        applicationContext.close();


    }

    /**
     * 通过名称定义
     * @param registry      Bean定义信息注册中心
     * @param beanName      bean的名称
     */
    public static void registerUserBeanDefinition(BeanDefinitionRegistry registry,String beanName){
        BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(User.class);

        beanDefinitionBuilder
                .addPropertyValue("id",1)
                .addPropertyValue("name","mercy:xiaomage");

        if(beanName != null){
            registry.registerBeanDefinition(beanName,beanDefinitionBuilder.getBeanDefinition());
        }else {
            BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinitionBuilder.getBeanDefinition(),registry);
        }


    }

    /**
     * 非命名的方式
     * @param registry  注册中心
     */
    public static void registerUserBeanDefinition(BeanDefinitionRegistry registry){
        registerUserBeanDefinition(registry,null);
    }


    /**
     * 配置类
     */
    @Component
    public class Config{
        @Bean(name = {"user","xiaomage-user"})
        public User user(){
            User user = new User();
            user.setId(1);
            user.setName("小马哥：annotation");
            return user;
        }
    }
}
